<?php

/**
 * This is the model class for table "Ambiente".
 *
 * The followings are the available columns in table 'Ambiente':
 * @property integer $ID_AMBIENTE
 * @property integer $ID_PREDIO
 * @property string $TX_NOME
 * @property integer $NU_CAPACIDADE
 */
class Ambiente extends CActiveRecord {

    /**
     * Returns the static model of the specified AR class.
     * @return Ambiente the static model class
     */
    public static function model($className=__CLASS__) {
        return parent::model($className);
    }

    /**
     * @return string the associated database table name
     */
    public function tableName() {
        return 'Ambiente';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules() {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('ID_PREDIO, TX_NOME, NU_CAPACIDADE', 'required'),
            array('ID_PREDIO, NU_CAPACIDADE', 'numerical', 'integerOnly' => true),
            array('TX_NOME', 'length', 'max' => 20),
            // The following rule is used by search().
            // Please remove those attributes that should not be searched.
            array(
                'ID_PREDIO,
                    TX_NOME,
                    NU_CAPACIDADE,
                    ID_RECURSO,
                    ID_USO,
                    predio',
                'safe', 'on' => 'search'),
        );
    }

    /**
     * @return array relational rules.
     */
    public function relations() {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'recursos' => array(self::MANY_MANY, 'Recurso', 'ambiente_recurso(ID_AMBIENTE, ID_RECURSO)'),
            'usos' => array(self::MANY_MANY, 'Uso', 'ambiente_uso(ID_AMBIENTE, ID_USO)'),
            'templates' => array(self::HAS_MANY, 'Templates', 'ID_AMBIENTE'),
            'iD_PREDIO' => array(self::BELONGS_TO, 'Predio', 'ID_PREDIO'),
        );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels() {
        return array(
            'ID_AMBIENTE' => 'Código',
            'ID_PREDIO' => 'Prédio',
            'TX_NOME' => 'Ambiente',
            'NU_CAPACIDADE' => 'Capacidade',
            'predio' => 'Prédio',
        );
    }

    /**
     * Retrieves a list of models based on the current search/filter conditions.
     * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
     */
    public function search() {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria = new CDbCriteria;

        $criteria->with = array('recursos', 'usos', 'iD_PREDIO');

        $criteria->compare('ID_AMBIENTE', $this->ID_AMBIENTE);

        if ($this->ID_PREDIO != -1) {
            $criteria->compare('iD_PREDIO.TX_DESCRICAO', $this->getPredio());
        }

        $criteria->compare('TX_NOME', $this->TX_NOME, true);

        $criteria->compare('NU_CAPACIDADE', $this->NU_CAPACIDADE);


        $sort = new CSort();
        $sort->attributes = array(
            'defaultOrder' => 'iD_PREDIO.TX_DESCRICAO ASC, t.TX_NOME ASC',
            'ID_AMBIENTE' => array(
                'asc' => 't.ID_AMBIENTE',
                'desc' => 't.ID_AMBIENTE desc',
            ),
            'ID_PREDIO' => array(
                'asc' => 'iD_PREDIO.TX_DESCRICAO asc',
                'desc' => 'iD_PREDIO.TX_DESCRICAO desc',
            ),
            'TX_NOME' => array(
                'asc' => 't.TX_NOME',
                'desc' => 't.TX_NOME desc',
            ),
            'NU_CAPACIDADE' => array(
                'asc' => 't.NU_CAPACIDADE',
                'desc' => 't.NU_CAPACIDADE desc',
            ),
        );

        return new CActiveDataProvider('Ambiente', array(
                    'criteria' => $criteria,
                ));
    }

    public function advancedSearch() {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.
        $arrayRecursos = array();
        $arrayUsos = array();
        $criteria = new CDbCriteria;
        
        $criteria->group = 't.ID_AMBIENTE';

        $criteria->with = array('iD_PREDIO');

        $criteria->join = 'LEFT OUTER JOIN ambiente_recurso recursos_recursos ON (t.ID_AMBIENTE = recursos_recursos.ID_AMBIENTE) LEFT OUTER JOIN recurso recursos ON (recursos.ID_RECURSO = recursos_recursos.ID_RECURSO) LEFT OUTER JOIN `ambiente_uso` `usos_usos` ON (`t`.`ID_AMBIENTE`=`usos_usos`.`ID_AMBIENTE`) LEFT OUTER JOIN `Uso` `usos` ON (`usos`.`ID_USO`=`usos_usos`.`ID_USO`)';

        if ($this->ID_PREDIO != -1) {
            $criteria->compare('t.ID_PREDIO', $this->ID_PREDIO);
        }

        if (isset($_GET['Ambiente_Recurso']['ID_RECURSO'])) {
            $arrayRecursos = $_GET['Ambiente_Recurso']['ID_RECURSO'];
        }
        if (isset($_GET['Ambiente_Uso']['ID_USO'])) {
            $arrayUsos = $_GET['Ambiente_Uso']['ID_USO'];
        }


        if (is_array($arrayRecursos)) {
            foreach ($arrayRecursos as $recurso) {
                $criteria->addCondition(
                        '(exists (select 1 from ambiente_recurso inner join ambiente 
                        on (ambiente_recurso.id_ambiente = ambiente.id_ambiente)
                        where ambiente_recurso.id_ambiente = t.id_ambiente and ambiente_recurso.id_recurso = ' . $recurso . '))', 'AND');
            }
        }
        if (is_array($arrayUsos)) {
            foreach ($arrayUsos as $uso) {
                $criteria->addCondition(
                        '(exists (select 1 from ambiente_uso inner join ambiente 
                        on (ambiente_uso.id_ambiente = ambiente.id_ambiente)
                        where ambiente_uso.id_ambiente = t.id_ambiente and ambiente_uso.id_uso = ' . $uso . '))', 'AND');
            }
        }

        $criteria->compare('NU_CAPACIDADE', $this->NU_CAPACIDADE);

        $criteria->order = ('iD_PREDIO.TX_DESCRICAO ASC, TX_NOME ASC');

        $_GET['Ambiente_Recurso'] = null;
        $_GET['Ambiente_Uso'] = null;
        $sort = new CSort();
        $sort->attributes = array(
            'defaultOrder' => 'iD_PREDIO.TX_DESCRICAO ASC, t.TX_NOME ASC',
            'ID_AMBIENTE' => array(
                'asc' => 't.ID_AMBIENTE',
                'desc' => 't.ID_AMBIENTE desc',
            ),
            'ID_PREDIO' => array(
                'asc' => 'iD_PREDIO.TX_DESCRICAO asc',
                'desc' => 'iD_PREDIO.TX_DESCRICAO desc',
            ),
            'TX_NOME' => array(
                'asc' => 't.TX_NOME',
                'desc' => 't.TX_NOME desc',
            ),
            'NU_CAPACIDADE' => array(
                'asc' => 't.NU_CAPACIDADE',
                'desc' => 't.NU_CAPACIDADE desc',
            ),
        );
        return new CActiveDataProvider('Ambiente', array(
                    'criteria' => $criteria,
                ));
    }

    public function getAmbientesComPredio() {
        $ambiente = new Ambiente();
        $dataprovider = $ambiente->search();
        $dados = $dataprovider->getData();
        $max = $dataprovider->getItemCount();
        $ret = array();
        for ($i = 0; $i < $max; $i++) {
            $ret += array($dados[$i]['ID_AMBIENTE'] => $dados[$i]['iD_PREDIO']['TX_DESCRICAO'] . ' - ' . $dados[$i]['TX_NOME']);
        }

        return $ret;
    }

    public function getPredios() {
        $predio = new Predio();
        $dataprovider = $predio->search();
        $dados = $dataprovider->getData();
        $max = $dataprovider->getItemCount();
        $ret = array();
        for ($i = 0; $i < $max; $i++) {
            $ret += array($dados[$i]['ID_PREDIO'] => $dados[$i]['TX_DESCRICAO']);
        }

        return $ret;
    }

    private $_predio = null;

    public function getPredio() {
        if ($this->_predio === null && $this->iD_PREDIO !== null) {
            $this->_predio = $this->iD_PREDIO->TX_DESCRICAO;
        }
        return $this->_predio;
    }

    public function setPredio($value) {
        $this->_predio = $value;
    }

}